Utforska glob-mönstermatchning för effektiv filvägsidentifiering och filtrering. Lär dig syntax, bästa praxis och verkliga exempel för olika programmeringsspråk och operativsystem.
Glob-mönstermatchning: En omfattande guide till filvägsidentifiering och filtrering
Inom programvaruutveckling och systemadministration är effektiv hantering och manipulering av filer ett grundläggande krav. Glob-mönstermatchning erbjuder ett kraftfullt och koncist sätt att upptäcka och filtrera filer baserat på angivna mönster. Denna artikel kommer att fördjupa sig i globbingens krångligheter, utforska dess syntax, användning och tillämpningar över olika programmeringsspråk och operativsystem.
Vad är Glob-mönstermatchning?
Globbing, en förkortning av "global", är en teknik som används för att matcha filnamn och katalogvägar med hjälp av jokertecken. Till skillnad från reguljära uttryck, som erbjuder mer komplexa och nyanserade mönstermatchningsförmågor, fokuserar globbing på enkla och intuitiva mönsterdefinitioner. Det används ofta i kommandoradsgränssnitt, shell-skript och programmeringsspråk för att identifiera uppsättningar av filer eller kataloger som uppfyller specifika kriterier.
Grundläggande Globbing-syntax
Kärnan i glob-mönstermatchning ligger i dess jokertecken. Dessa tecken utgör en kortform för att representera ett eller flera tecken i ett fil- eller katalognamn. De vanligaste jokertecknen inkluderar:
*
(Asterisk): Matchar noll eller fler tecken. Till exempel matchar*.txt
alla filer som slutar med ".txt".?
(Frågetecken): Matchar exakt ett tecken.file?.txt
matchar "file1.txt", "file2.txt", men inte "file12.txt".[]
(Fyrkantiga parenteser): Matchar vilket enskilt tecken som helst inom parenteserna.file[1-3].txt
matchar "file1.txt", "file2.txt" och "file3.txt". Du kan också ange teckenintervall som [a-z] eller [A-Z].file[abc].txt
matchar "filea.txt", "fileb.txt" och "filec.txt".[^]
(Caret inuti fyrkantiga parenteser): Matchar vilket enskilt tecken som helst inte inom parenteserna.file[^1-3].txt
skulle matcha "file4.txt", "filea.txt", etc., men inte "file1.txt", "file2.txt" eller "file3.txt".{}
(Lockiga parenteser – stöds inte universellt): Tillåter specificering av flera alternativ.file{1,2,3}.txt
är ekvivalent medfile1.txt file2.txt file3.txt
. Detta kan också användas för mer komplexa mönster somimage.{png,jpg,gif}
.
Dessa grundläggande jokertecken kan kombineras för att skapa mer komplexa mönster. Till exempel skulle *.log.*
matcha vilken fil som helst som slutar på ".log" följt av en annan filändelse.
Globbing i olika programmeringsspråk
Även om globbingens kärnkoncept förblir konsekventa, kan de specifika implementeringarna och syntaxen variera något mellan olika programmeringsspråk.
Python
Python tillhandahåller modulen glob
för att arbeta med glob-mönster.
import glob
# Find all .txt files in the current directory
txt_files = glob.glob("*.txt")
print(txt_files)
# Find all .jpg files in a subdirectory called 'images'
jpg_files = glob.glob("images/*.jpg")
print(jpg_files)
# Recursively find all .py files in the current directory and its subdirectories
py_files = glob.glob("**/*.py", recursive=True)
print(py_files)
Modulen glob
:s funktion glob()
tar ett glob-mönster som indata och returnerar en lista med matchande filvägar. Argumentet recursive=True
tillåter att man traverserar underkataloger, en funktion som introducerades i Python 3.5.
Exempel: Internationaliseringsfiler (i18n)
Föreställ dig ett projekt med översättningsfiler organiserade efter språkkod, t.ex. en.json
, fr.json
, de.json
. För att hitta alla översättningsfiler kan du använda: glob.glob("*.json")
. Detta fungerar globalt, oavsett vilka specifika språkkoder som används i filnamnen.
JavaScript (Node.js)
I Node.js tillhandahåller paketet glob
(tillgängligt via npm) globbing-funktionalitet.
const glob = require("glob");
// Find all .js files in the 'src' directory
glob("src/**/*.js", (err, files) => {
if (err) {
console.error(err);
return;
}
console.log(files);
});
Funktionen glob()
i Node.js är asynkron och tar en callback-funktion som tar emot ett felobjekt och en array med matchande filvägar. Mönstret src/**/*.js
söker rekursivt efter alla .js
-filer inom src
-katalogen och dess underkataloger.
Exempel: Hitta konfigurationsfiler
Många JavaScript-projekt använder konfigurationsfiler som .eslintrc.js
eller webpack.config.js
. Du kan använda glob för att snabbt hitta dessa filer: glob("*.config.js")
.
Java
Java 7 introducerade paketet java.nio.file
, som inkluderar stöd för globbing via metoden FileSystem.getPathMatcher()
.
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class GlobExample {
public static void main(String[] args) throws IOException {
Path startingDir = Paths.get(".");
String pattern = "glob:**/*.java"; // Recursive search for Java files
PathMatcher matcher = FileSystems.getDefault().getPathMatcher(pattern);
Files.walkFileTree(startingDir, new SimpleFileVisitor() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
if (matcher.matches(file)) {
System.out.println("Found: " + file);
}
return FileVisitResult.CONTINUE;
}
});
}
}
Detta exempel använder Files.walkFileTree()
för att traversera filsystemet och PathMatcher
för att kontrollera om varje fil matchar det angivna glob-mönstret. Mönstret glob:**/*.java
söker rekursivt efter alla .java
-filer.
Exempel: Laddar plugin-filer
Föreställ dig en Java-applikation som laddar plugins från en specifik katalog. Globbing kan användas för att hitta alla JAR-filer i plugin-katalogen: glob:plugins/*.jar
.
Shell-skript (Bash)
Globbing är djupt integrerat i shell-skriptspråk som Bash.
#!/bin/bash
# Find all .txt files in the current directory
for file in *.txt;
do
echo "Found file: $file"
done
# Find all files starting with 'report' in the 'logs' directory
for file in logs/report*;
do
echo "Found report: $file"
done
#Recursively find all files ending in '.conf'
shopt -s globstar #Enable globstar
for file in **/*.conf;
do
echo "Found conf file: $file"
done
I Bash expanderas glob-mönster direkt av shellen innan kommandot körs. Alternativet globstar
(shopt -s globstar
) möjliggör rekursiv globbing med mönstret **
.
Exempel: Systemadministrationsskript Systemadministratörer använder ofta globbing i skript för att hantera loggfiler, konfigurationsfiler eller andra systemresurser. Till exempel kan radering av alla temporära filer äldre än ett visst datum innebära globbing för att identifiera de relevanta filerna.
Avancerade Globbing-tekniker
Utökad Globbing (Bash)
Bash tillhandahåller utökade globbing-funktioner som erbjuder kraftfullare mönstermatchningsförmågor. Dessa funktioner måste aktiveras med kommandot shopt
.
#!/bin/bash
shopt -s extglob # Enable extended globbing
# Match files that end in .txt but are NOT named 'important.txt'
for file in !(important).txt;
do
echo "Found file: $file"
done
# Match files that start with 'data' followed by one or more digits
for file in data+([0-9]).txt;
do
echo "Found file: $file"
done
Några användbara utökade globbing-mönster:
?(pattern)
: Matchar noll eller en förekomst av mönstret.*(pattern)
: Matchar noll eller fler förekomster av mönstret.+(pattern)
: Matchar en eller fler förekomster av mönstret.@(pattern1|pattern2|pattern3)
: Matchar ett av de angivna mönstren.!(pattern)
: Matchar allt utom det angivna mönstret.
Kombinera Globbing med andra verktyg
Globbing kan sömlöst integreras med andra kommandoradsverktyg för att utföra mer komplexa filmanipuleringsuppgifter.
# Find all .txt files and pipe the list to grep to search for the word 'error'
ls *.txt | grep "error"
# Use find with globbing to delete all .tmp files older than 7 days
find . -name "*.tmp" -mtime +7 -delete
Det första exemplet använder ls
för att lista alla .txt
-filer och skickar sedan utdata till grep
för att söka efter rader som innehåller ordet "error". Det andra exemplet använder find
med alternativet -name
för att hitta alla .tmp
-filer och alternativet -mtime
för att filtrera filer som är äldre än 7 dagar innan de raderas.
Globbing vs. Reguljära Uttryck
Även om både globbing och reguljära uttryck används för mönstermatchning, skiljer de sig markant i komplexitet och förmåga.
Globbing:
- Enkel och intuitiv syntax.
- Används främst för matchning av filnamn.
- Begränsad uppsättning jokertecken.
- Snabbare exekvering för enkla mönster.
Reguljära Uttryck:
- Mer komplex syntax med ett bredare utbud av metatecken och kvantifikatorer.
- Kan användas för att matcha mönster i vilken text som helst, inte bara filnamn.
- Kraftfull och flexibel för komplexa mönstermatchningsscenarier.
- Kan vara långsammare än globbing för enkla mönster på grund av overheaden i den reguljära uttrycksmotorn.
Generellt sett är globbing lämplig för enkla filnamnsmatchningsuppgifter, medan reguljära uttryck är bättre lämpade för mer komplex textbehandling och mönstermatchningsscenarier.
Bästa praxis för att använda Glob-mönstermatchning
- Var specifik: Undvik alltför breda mönster som kan matcha oavsedda filer. Till exempel, istället för
*
, använd*.txt
för att endast rikta in dig på textfiler. - Använd rekursion försiktigt: Rekursiv globbing (t.ex.
**/*
) kan vara resurskrävande, särskilt i stora katalogstrukturer. Överväg prestandakonsekvenserna innan du använder rekursiva mönster. - Testa dina mönster: Innan du kör kommandon som ändrar eller tar bort filer baserat på glob-mönster, testa mönstren för att säkerställa att de matchar de avsedda filerna. Använd
ls
ellerecho
för att förhandsgranska resultaten. - Förstå plattformsspecifika skillnader: Var medveten om subtila variationer i globbing-implementeringar över olika operativsystem och skal. Till exempel kan skiftlägeskänslighet variera.
- Escape specialtecken: Om du behöver matcha ett bokstavligt jokertecken (t.ex. en asterisk), escapea det med ett bakåtsnedstreck (
\\*
).
Verkliga exempel och användningsfall
- Webbutveckling: Hitta alla bildfiler (
.jpg
,.png
,.gif
) i en tillgångskatalog för optimering. - Dataanalys: Bearbeta en serie loggfiler med namn som
data_2023-10-26.log
,data_2023-10-27.log
, etc. - Systemadministration: Rotera loggfiler genom att identifiera och arkivera filer äldre än ett specifikt datum.
- Byggautomation: Inkludera eller exkludera specifika filer eller kataloger under byggprocessen.
- Kodgenerering: Lokalisera mallfiler för att generera kod baserat på specifika mönster.
- Konfigurationshantering: Hitta alla konfigurationsfiler i en projektkatalog.
Säkerhetsöverväganden
När du använder globbing är det avgörande att vara medveten om potentiella säkerhetsrisker. Om användarinmatning används för att konstruera glob-mönster kan det leda till oavsiktlig filåtkomst eller modifiering. För att mildra dessa risker:
- Sanera användarinmatning: Validera och sanera alltid användarinmatning innan den används i glob-mönster för att förhindra skadliga mönster.
- Begränsa åtkomst: Se till att processen som utför globbing-operationen har de minst nödvändiga behörigheterna för att komma åt och ändra filer.
- Använd säkra alternativ: I situationer där säkerhet är avgörande, överväg att använda mer kontrollerade filsystem-API:er istället för att enbart förlita dig på globbing.
Slutsats
Glob-mönstermatchning är ett kraftfullt och mångsidigt verktyg för att upptäcka och filtrera filvägar. Dess enkla syntax och breda tillgänglighet gör det till en nödvändig färdighet för utvecklare, systemadministratörer och alla som arbetar med filer och kataloger. Genom att förstå kärnkoncepten, syntaxvariationerna och bästa praxis kan du utnyttja globbing för att effektivisera ditt arbetsflöde och automatisera filhanteringsuppgifter effektivt. Oavsett om du skriver shell-skript, utvecklar applikationer eller hanterar servrar, erbjuder globbing ett koncist och effektivt sätt att interagera med filsystemet.